home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
626-637
/
disk_632
/
printfiles
/
source
/
prf_print.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-05-06
|
7KB
|
265 lines
/* prf_print.c */
/* V1.1 14-3-92 */
#include "prf.h"
char *dayname[]=
{
T_SUNDAY,T_MONDAY,T_TUESDAY,T_WEDNESDAY,T_THURSDAY,T_FRIDAY,T_SATURDAY
};
char *monthname[]=
{
T_JAN,T_FEB,T_MAR,T_APR,T_MAY,T_JUNE,T_JULY,T_AUG,T_SEP,T_OCT,T_NOV,T_DEC
};
long BuildStatusline(struct prf_info *,UBYTE *);
long CheckFile(struct prf_info *,UBYTE *);
long PopFile(struct prf_info *,UBYTE *);
void PushFile(struct prf_info *,UBYTE *);
long PrintText(struct prf_info *,UBYTE *);
void PrintQueue(struct prf_info *info)
{
long end = FALSE;
UBYTE filename[256];
FILE *display = NULL;
info->flags |= FLAG_PRINT;
if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Print],info->Swd,NULL,GA_Disabled,TRUE,TAG_DONE);
if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_PPrint - PGD],info->Pwd,NULL,GA_Disabled,TRUE,TAG_DONE);
if(info->Swd)
{
SwdTags[0].ti_Data = (ULONG)info->Swd->LeftEdge;
SwdTags[1].ti_Data = (ULONG)info->Swd->TopEdge;
}
sprintf(filename,"CON:%ld/%ld/%ld/%ld/%s",
SwdTags[0].ti_Data,SwdTags[1].ti_Data,
SwdTags[2].ti_Data,info->BarHeight * 4,T_DISPLAYNAME);
if((info->flags & FLAG_DISPLAY) && ((info->Pwd) || (info->Swd)))
display = fopen(filename,"w");
while (!end && PopFile(info,filename))
{
if(display)fprintf(display,"\n%s",filename);
switch(CheckFile(info,filename))
{
case FILE_TEXT : if(PrintText(info,filename) == CMD_QUIT) end = TRUE;
info->Special1 = (APTR)filename;
RemoveName(info);
info->Special1 = NULL;
break;
case FILE_ILBM : if(display)fprintf(display,ERROR_ILBM);break;
case FILE_FTXT : if(display)fprintf(display,ERROR_FTXT);break;
case FILE_PROG : if(display)fprintf(display,ERROR_PROG);break;
case FILE_ICON : if(display)fprintf(display,ERROR_ICON);break;
case FILE_DIR : if(display)fprintf(display,ERROR_DIR);break;
default : end = TRUE;
break;
}
}
if(display) fclose(display);
if(info->Pwd)GT_SetGadgetAttrs(info->PGadgets[GD_PPrint - PGD],info->Pwd,NULL,GA_Disabled,FALSE,TAG_DONE);
if(info->Swd)GT_SetGadgetAttrs(info->SGadgets[GD_Print],info->Swd,NULL,GA_Disabled,FALSE,TAG_DONE);
info->flags ^= FLAG_PRINT;
}
long PrintText(struct prf_info *info,UBYTE *name)
{
long rc = CMD_NEUTRAL;
long line = 0;
long lines = 1;
long page = 1;
long offset = 0;
FILE *printer;
FILE *file;
UBYTE buffer[STR_SIZE];
long end = FALSE;
if(file = fopen(name,"r"))
{
if(printer = fopen("prt:","w"))
{
if(info->Columns <= 0L) info->Columns = 1L;
if(info->flags & FLAG_DRAFT) fprintf(printer,"\x1b[1\x22z");
if(info->flags & FLAG_LQ) fprintf(printer,"\x1b[2\x22z");
if(info->flags & FLAG_PITCH6) fprintf(printer,"\x1b[1z");
if(info->flags & FLAG_PITCH8) fprintf(printer,"\x1b[0z");
if(info->flags & FLAG_10CPI) fprintf(printer,"\x1b[0w");
if(info->flags & FLAG_12CPI) fprintf(printer,"\x1b[0w\x1b[2w");
if(info->flags & FLAG_15CPI) fprintf(printer,"\x1b[0w\x1b[4w");
fprintf(printer,"\x1b[%ld;%lds",info->Lmargin,info->Rmargin);
offset = BuildStatusline(info,name);
while(!end)
{
if(fgets(buffer,STR_SIZE,file))
{
if(DoCommand(info,HandleMsgs(info)) == CMD_QUIT)
{
end = TRUE;
rc = CMD_QUIT;
}
if(line == (info->Lines - offset))
{
if(*(info->Footline))
{
fprintf(printer,"%s\n",info->Footline);
if (strlen(info->Footline) > info->Columns) line += strlen(info->Footline)/info->Columns;
}
if(info->flags & FLAG_PAGE) fprintf(printer,"*** " T_PAGE ": %5d ***",page);
fprintf(printer,"\f");
line = 0;line = 0;page++;
}
if(line == 0)
{
if(*(info->Statusline))
{
fprintf(printer,"%s\n",info->Statusline);
if (strlen(info->Statusline) > info->Columns) line += strlen(info->Statusline)/info->Columns;
}
if(info->Headline)
{
fprintf(printer,"%s\n\n",info->Headline);
if (strlen(info->Headline) > info->Columns) line += strlen(info->Headline)/info->Columns;
}
}
if(info->flags & FLAG_LINE)
{
fprintf(printer,"%5d:%s",lines,buffer) ;
if (strlen(buffer) > info->Columns) line += strlen(buffer)/info->Columns;
}
else
{
fprintf(printer,"%s",buffer);
if (strlen(buffer) > info->Columns) line += strlen(buffer)/info->Columns;
}
if(info->flags & FLAG_CRLF) fprintf(printer,"\n");
line++,lines++;
}
else end = TRUE;
}
if(*(info->Footline))fprintf(printer,"%s\n",info->Footline);
if(info->flags & FLAG_PAGE) fprintf(printer,"*** %5d " T_PAGES T_PRINTED "***\n",page);
if(info->flags & FLAG_FF) fprintf(printer,"\f");
fclose(printer);
}
else
{
PushFile(info,name); /* file not found */
}
fclose(file);
}
return rc;
}
long CheckFile(struct prf_info *info, UBYTE *name)
{
long rc = FILE_TEXT;
struct FileInfoBlock *fib;
BPTR fh,lock;
if(stricmp(name + (strlen(name) - 5), ".info"))
{
if(fib = (struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL))
{
if(lock = Lock(name,ACCESS_READ))
{
if(Examine(lock,fib))
{
if(fib->fib_DirEntryType > 0)
{
rc = FILE_DIR;
}
else
{
if(!(fib->fib_Protection & FIBB_SCRIPT))
{
if(fh = Open(name,MODE_OLDFILE))
{
UBYTE b[10];
if(Read(fh,b,4))
if(!(strnicmp(b,"\00\00\03\f3",4)))
{
rc = FILE_PROG;
}
if( (!(strnicmp(b,"form",4))) || (!(strnicmp(b,"list",4))) ||
(!(strnicmp(b,"prop",4))) || (!(strnicmp(b,"cat" ,3)))
)
{
Read(fh,b,4); /* read length of file */
Read(fh,b,4); /* read form type */
if(!(strnicmp(b,"ftxt",4)))rc = FILE_FTXT;
else if(!(strnicmp(b,"ilbm",4)))rc = FILE_ILBM;
else rc = FILE_UNKNOWN;
}
Close(fh);
}
}
}
}
UnLock(lock);
}
FreeDosObject(DOS_FIB,(APTR)fib);
}
}
else rc = FILE_ICON;
return rc;
}
long PopFile(struct prf_info *info,UBYTE *name)
{
long rc = FALSE;
struct FileNameNode *fnn;
DetachList(info);
if(fnn = (struct FileNameNode *)RemHead(&info->FileList))
{
if(*(fnn->fnn_Name))
{
rc = TRUE;
strcpy(name,fnn->fnn_Name);
free(fnn);
}
}
AttachList(info);
return rc;
}
void PushFile(struct prf_info *info,UBYTE *name)
{
struct FileNameNode *fnn;
if(*name)
{
if(fnn = calloc(1,sizeof(struct FileNameNode)))
{
strcpy(fnn->fnn_Name,name);
fnn->fnn_Node.ln_Name = fnn->fnn_Name;
DetachList(info);
AddHead(&info->FileList,(struct Node *)fnn);
AttachList(info);
}
}
}
long BuildStatusline(struct prf_info *info,UBYTE *name)
{
long rc = 0;
char buffer1[STR_SIZE],buffer2[STR_SIZE],buffer3[STR_SIZE];
long t;
struct tm *date;
time(&t);
date = localtime(&t);
*buffer1 = '\0';
*buffer2 = '\0';
*buffer3 = '\0';
if(info->flags & FLAG_DATE) sprintf(buffer1,DATE_FORMAT);
if(info->flags & FLAG_TIME) sprintf(buffer2,TIME_FORMAT);
if(info->flags & FLAG_FILE) sprintf(buffer3,NAME_FORMAT);
if((*(buffer1)) || (*(buffer2)) || (*(buffer3)))
{
sprintf(info->Statusline,"*** %s%s%s ***",buffer1,buffer2,buffer3);
rc += 1;
}
if(info->flags & FLAG_PAGE)rc += 1;
if(*(info->Headline))rc += 2;
if(*(info->Footline))rc += 1;
return rc;
}